package com.nathan.crm.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nathan.base.BaseService;
import com.nathan.crm.dao.CusDevPlanMapper;
import com.nathan.crm.dao.SaleChanceMapper;
import com.nathan.crm.query.CusDevPlanQuery;
import com.nathan.crm.utils.AssertUtil;
import com.nathan.crm.vo.CusDevPlan;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/*
    客户开发计划业务层
 */
@Service
public class CusDevPlanService extends BaseService<CusDevPlan,Integer> {

    @Resource
    private CusDevPlanMapper cusDevPlanMapper;
    @Resource
    private SaleChanceMapper saleChanceMapper;

    /*
        多条件查询客户开发计划
     */
    public Map<String,Object> queryCusDevPlanByParams(CusDevPlanQuery cusDevPlanQuery){
        Map<String,Object> map = new HashMap<>();

        //开启分页
        PageHelper.startPage(cusDevPlanQuery.getPage(),cusDevPlanQuery.getLimit());
        PageInfo<CusDevPlan> pageInfo = new PageInfo<>(cusDevPlanMapper.queryCusDevPlanByParams(cusDevPlanQuery));

        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        map.put("data",pageInfo.getList());

        return map;
    }

    /*
        添加客户开发计划项数据
            1。参数校验
                营销机会ID  非空，数据存在
                计划项内容   非空
                计划时间    非空
            2．设置参数的默认值
                是否有效    默认有效
                创建时间    系统当前时间
                修改时间    系统当前时间
            3。执行添加操作，判断受影响的行数
     */
    @Transactional
    public void addCusDevPlan(CusDevPlan cusDevPlan){
        // 1.参数校验
        checkCusDevPlanParams(cusDevPlan);

        /* 设置参数的默认值 */
        //  是否有效    默认有效
        cusDevPlan.setIsValid(1);
        //  创建时间    系统当前时间
        cusDevPlan.setCreateDate(new Date());
        //  修改时间    系统当前时间
        cusDevPlan.setUpdateDate(new Date());

        AssertUtil.isTrue(cusDevPlanMapper.insertSelective(cusDevPlan) != 1,"添加失败！");
    }

    /*
        更新客户开发计划项数据
            1.参数校验
                计划项ID   非空，数据存在
                营销机会ID  非空，数据存在
                计划项内容   非空
                计划时间    非空
            2.设置参数的默认值
                修改时间    系统当前时间
            3.执行更新操作，判断受影响的行数
     */
    @Transactional
    public void updateCusDevPlan(CusDevPlan cusDevPlan){
        /* 参数校验 */
        //计划项ID   非空，数据存在
        AssertUtil.isTrue(null == cusDevPlan.getId() || cusDevPlanMapper.selectByPrimaryKey(cusDevPlan.getId()) == null,"数据异常，请重试");
        checkCusDevPlanParams(cusDevPlan);

        /* 2.设置参数的默认值 */
        cusDevPlan.setUpdateDate(new Date());

        /* 执行更新操作 */
        AssertUtil.isTrue(cusDevPlanMapper.updateByPrimaryKeySelective(cusDevPlan) != 1,"更新失败！");
    }

    /*
        根据id删除记录
     */
    @Transactional
    public void deleteById(Integer id){
        cusDevPlanMapper.deleteById(id);
    }

    /*
        参数校验
     */
    private void checkCusDevPlanParams(CusDevPlan cusDevPlan) {
        Integer sid = cusDevPlan.getSaleChanceId();
        // 营销机会ID  非空，数据存在
        AssertUtil.isTrue(sid == null || saleChanceMapper.selectByPrimaryKey(sid) == null,"数据错误，请重试！" );

        // 计划项内容   非空
        AssertUtil.isTrue(StringUtils.isBlank(cusDevPlan.getPlanItem()),"计划内容不能为空！");
        // 计划时间    非空
        AssertUtil.isTrue(cusDevPlan.getPlanDate() == null,"计划时间不能为空！");
    }

}
